package com.atdel.demo24;

import java.util.HashMap;
import java.util.Map;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo24
 * @Author: Del
 * @CreateTime: 2025-03-21  09:33
 * @Description: 该类缓存并使用ValueConverter枚举中的转换策略进行值转换
 * 值转换上下文类，用于根据字段类型转换值
 * @Version: 1.0
 */
public class ValueConversionContext {
    // 转换策略缓存，用于提高转换效率
    private Map<Class<?>, ValueConverter> converterCache = new HashMap<>();

    /***
     * @author: Del
     * @date: 2025/3/21 9:46
     * @param: value 需要转换的原始值
     * @param: fieldType
     * @return: java.lang.Object
     * @description:
     **/
    public Object convertValue(Class<?> fieldType, Object value) {
        if (value == null) {
            return getDefaultValueForType(fieldType);
        }

        // 从缓存中获取转换策略
        ValueConverter converter = converterCache.get(fieldType);
        if (converter != null && converter.supports(fieldType, value)) {
            return converter.convert(value);
        }

        // 遍历所有转换策略，找到匹配的策略并执行转换
        for (ValueConverter candidate : ValueConverter.values()) {
            if (candidate.supports(fieldType, value)) {
                // 缓存匹配的转换策略
                converterCache.put(fieldType, candidate);
                return candidate.convert(value);
            }
        }

        // 如果没有找到合适的转换策略，则返回原始值
        return value;
    }

    private Object getDefaultValueForType(Class<?> fieldType) {
        if (fieldType == int.class || fieldType == Integer.class) {
            return 0;
        } else if (fieldType == long.class || fieldType == Long.class) {
            return 0L;
        } else if (fieldType == double.class || fieldType == Double.class) {
            return 0.0;
        } else if (fieldType == boolean.class || fieldType == Boolean.class) {
            return false;
        } else {
            return null;
        }
    }
}
